home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / seyon / Seyon.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  9KB  |  381 lines

  1.  
  2. /*
  3.  * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M.
  4.  * Saggaf. All rights reserved.
  5.  *
  6.  * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full
  7.  * statement of rights and permissions for this program.
  8.  */
  9.  
  10. #include <signal.h>
  11.  
  12. #include <X11/Intrinsic.h>
  13. #include <X11/StringDefs.h>
  14.  
  15. #include "seyon.h"
  16. #include "SeDecl.h"
  17.  
  18. #if HAVE_TERMIOS
  19. #include <termios.h>
  20. struct termios  newmode,
  21.                 oldmode;
  22. #else
  23. #if HAVE_TERMIO
  24. #include <termio.h>
  25. struct termio   newmode,
  26.                 oldmode;
  27. #else
  28. #if HAVE_SGTTYB
  29. #include <sys/ioctl.h>
  30. struct sgttyb   newmode,
  31.                 oldmode;
  32. #endif
  33. #endif
  34. #endif
  35.  
  36. #define SEYON_EMU_NAME    "seyon-emu"
  37.  
  38. #include "version.h"
  39. static char     version[] = "$Revision: 2.14b $";
  40.  
  41. extern Widget   CreateCommandCenter();
  42. extern void     SetIcon(),
  43.                 GetResources(),
  44.                 InitVariables();
  45. extern void     PopupInitError(),
  46.                 PopupFatalError();
  47.  
  48. void            s_script(),
  49.                 s_set(),
  50.                 s_exit(),
  51.                 die(),
  52.                 cleanup_exit();
  53.  
  54. int             tfd,
  55.                 child_pipe[2],
  56.                 scriptToMainPipe[2],
  57.                 mainToTermPipe[2];
  58. FILE           *tfp;
  59.  
  60. struct QueryResources qres;
  61. XtAppContext    app_con;
  62. Widget          topLevel;
  63. pid_t           mainPid;
  64.  
  65. int
  66. main(argc, argv)
  67.      int             argc;
  68.      char           *argv[];
  69. {
  70.   int             OpenModem();
  71.   void            DispatchActions(),
  72.                   GetParameters(),
  73.                   ShowOpenModemErrMsg(),
  74.                   exit();
  75.  
  76.   char           *arg[REG_BUF], termEmu[REG_BUF];
  77.   int             sepIndex, i, n, retStatus;
  78. #ifdef HAVE_FAS
  79.   char            large_string[1024];
  80. #endif
  81.  
  82.   XtAppContext    appContext;
  83.   char            modemList[LRG_BUF], 
  84.                  *curModem, 
  85.                  *startupAction = modemList;
  86.  
  87.   static char    *fallbackResources[] = {
  88. #include "Seyon.ad.h"
  89.     NULL,
  90.   };
  91.  
  92.   static XrmOptionDescRec optionList[] =  {
  93.     {"-modems", "modems", XrmoptionSepArg, NULL},
  94.     {"-script", "script", XrmoptionSepArg, NULL},
  95.     {"-entries", "defaultPhoneEntries", XrmoptionSepArg, NULL},
  96.     {"-dial", "dialAutoStart", XrmoptionNoArg, "True"},
  97.     {"-nodial", "dialAutoStart", XrmoptionNoArg, "False"},
  98.     {"-emulator", "emulator", XrmoptionSepArg, ""},
  99.     {"-noemulator", "noemulator", XrmoptionNoArg, ""},
  100.     {"-nodefargs", "nodefargs", XrmoptionNoArg, ""},
  101.   };
  102.   
  103.   for (i = 1; i < argc && strcmp(argv[i], "--"); i++);
  104.   sepIndex = i;
  105.  
  106.   /* Find if the -noemulator switch is given */
  107.   for (i = 1; i < sepIndex && 
  108.        strncmp(argv[i], "-noemulator", max(4, strlen(argv[i]))); i++);
  109.  
  110.   /* If no, launch Seyon via the emulator */
  111.   if (i >= sepIndex) {
  112.  
  113.     for (i = 1; i < sepIndex &&
  114.          strncmp(argv[i], "-emulator", max(3, strlen(argv[i]))); i++);
  115.     if (i < sepIndex - 1)
  116.       strcpy(termEmu, argv[i+1]);
  117.     else
  118.       strcpy(termEmu, SEYON_EMU_NAME);
  119.  
  120.     /* Find if the -nodefargs switch is given */
  121.     for (i = 1; i < sepIndex && 
  122.          strncmp(argv[i], "-nodefargs", max(5, strlen(argv[i]))); i++);
  123.  
  124.     n = 1;
  125.  
  126.     /* If no, use the default emulator arguments */
  127.     if (i >= sepIndex) {
  128.       arg[n] = "-name"; n++;
  129.       arg[n] = "Seyon"; n++;
  130.       arg[n] = "-T"; n++;
  131.       arg[n] = "Seyon Terminal Emulator"; n++;
  132.       arg[n] = "-n"; n++;
  133.       arg[n] = "Terminal"; n++;
  134.     }
  135.  
  136.     /* Pass all switches aftetr '--' to the emulator */
  137.     for (i = sepIndex + 1; i < argc; i++, n++)
  138.       arg[n] = argv[i];
  139.     
  140.     arg[n] = "-e"; n++;
  141.  
  142. #ifndef HAVE_FAS
  143.     arg[n] = argv[0]; n++;
  144.     arg[n] = "-noemulator"; n++;
  145.  
  146.     /* Pass all switches before '--' to Seyon */
  147.     for (i = 1; i < sepIndex; i++, n++)
  148.       arg[n] = argv[i];
  149. #else
  150.     arg[n] = "/bin/sh";    n++;
  151.     arg[n] = "-c"; n++;
  152.     arg[n] = large_string;
  153.     strcpy(arg[n], argv[0]);
  154.     strcat(arg[n], " -noemulator");
  155.     for (i = 1; i < sepIndex; i++) {
  156.       strcat(arg[n]," ");
  157.       strcat(arg[n],argv[i]);
  158.     }
  159.     n++;
  160. #endif
  161.  
  162.     arg[n] = NULL; n++;
  163.  
  164.     arg[0] = termEmu;
  165.     execvp(arg[0], arg);
  166.  
  167.     fprintf(stderr, "%s `%s.\n%s\n", ">> Warning: Could not execute", 
  168.             termEmu, ">> Notice: Falling to `xterm'.");
  169.  
  170.     arg[0] = "xterm";
  171.     execvp(arg[0], arg);
  172.     
  173.     fprintf(stderr, "%s\n%s\n", ">> Error: Could not execute `xterm'.",
  174.             ">> Notice: Giving up.");
  175.     exit(1);
  176.   }  /* if (i >= sepIndex)... */
  177.  
  178.   /* ---------------------------------------------------------------------- */
  179.   /* ---------------------------------------------------------------------- */
  180.  
  181.   /* The real program begins here */
  182.  
  183.   topLevel = XtAppInitialize(&appContext, "Seyon", optionList,
  184.                              XtNumber(optionList), &argc, argv,
  185.                              fallbackResources, NULL, 0);
  186.   app_con = appContext;
  187.   GetResources(topLevel);
  188.  
  189.   mainPid = getpid();
  190.   setup_signal_handlers();
  191.   SetIcon(topLevel);
  192.  
  193.   printf("\r\n%s %s\r\n", "Seyon Copyright (c) 1992-1993 Muhammad M. Saggaf.",
  194.          "All rights reserved.");
  195.   printf("\rVersion %s rev. %s %s-%s %s@%s %s %s.\r\n\n", VERSION, REVISION, 
  196.          COMPILE_HOSTTYPE, COMPILE_OSNAME, COMPILE_BY, COMPILE_HOST,
  197.          COMPILE_DATE, COMPILE_TIME);
  198. #ifdef SCO
  199.   printf("Modified for SCO ODT 3.0 (tom@sco.com) [v. 1.3]\n");
  200. #endif
  201.  
  202.  
  203.   if ((tfp = fopen("/dev/tty", "r+")) == NULL) {
  204.     PopupInitError("errTtyAccess", exit);
  205.     goto MainLoop;
  206.   }
  207.  
  208.   tfd = fileno(tfp);
  209.  
  210.   io_get_attr(tfd, &oldmode);  /* get current console tty mode    */
  211.   newmode = oldmode;           /* copy (structure) to newmode  */
  212.  
  213. #if HAVE_TERMIOS || HAVE_TERMIO
  214.   newmode.c_oflag &= ~OPOST;
  215.   newmode.c_iflag |= (IGNBRK | IGNPAR);
  216.   newmode.c_iflag &= ~(IXON | IXOFF | ISTRIP | BRKINT);
  217.   newmode.c_lflag &= ~(ICANON | ISIG | ECHO);
  218.   newmode.c_cflag |= CREAD;
  219.   newmode.c_cc[VMIN] = 1;
  220.   newmode.c_cc[VTIME] = 1;
  221. #else
  222. #if HAVE_SGTTYB
  223.   newmode.sg_flags = CBREAK;
  224. #endif
  225. #endif
  226.  
  227.   set_tty_mode();
  228.  
  229.   InitVariables(topLevel);
  230.  
  231.   if (argc > 1 && strcmp(argv[1], "--")) {
  232.     SeErrorF("Unknown or incomplete command-line switch: `%s'", argv[1], 
  233.              "", "");
  234.     PopupInitError("errSwitches", do_exit);
  235.     goto MainLoop;
  236.   }
  237.  
  238.   /* ---------------------------------------------------------------------- */
  239.  
  240.   /* Open modem port and configure it */
  241.  
  242.   strcpy(modemList, qres.modems);
  243.   curModem = GetFirstWord(modemList);
  244.  
  245.   show("Locating Modems...");
  246.  
  247.   do {
  248.     if ((retStatus = OpenModem(curModem)) >= 0) break;
  249.  
  250.     ShowOpenModemErrMsg(curModem, retStatus);
  251.     if (retStatus != ERR_MDM_NOMODEM)
  252.       show(FmtString("Modem ``%s'' is Unavailable.\n", curModem, "", ""));
  253.     curModem = GetNextWord();
  254.   } while (curModem[0] != '\0');
  255.  
  256.   if (retStatus < 0) {
  257.     SeError("No Modems Available");
  258.     PopupInitError("errModemInit", do_exit); 
  259.     goto MainLoop;
  260.   }
  261.  
  262.   show(FmtString("Modem ``%s'' is Available.\n", curModem, "", ""));
  263.  
  264.   /* ---------------------------------------------------------------------- */
  265.  
  266.   CreateCommandCenter();
  267.  
  268.   /* ---------------------------------------------------------------------- */
  269.  
  270.   pipe(child_pipe);
  271.   pipe(scriptToMainPipe);
  272.   pipe(mainToTermPipe);
  273.   XtAppAddInput(appContext, child_pipe[0], (XtPointer)XtInputReadMask, 
  274.                 ExecProcRequest, NULL);
  275.   XtAppAddInput(appContext, scriptToMainPipe[0], (XtPointer)XtInputReadMask, 
  276.                 GetParameters, NULL);
  277.  
  278.   IdleGuard();
  279.   if (qres.showFunMessages) XtAppAddTimeOut(appContext, 
  280.                             qres.funMessagesInterval*1000, FunMessage, NULL);
  281.  
  282.   /* ---------------------------------------------------------------------- */
  283.  
  284.   strcpy(startupAction, qres.startupAction);
  285.   if (qres.script) sprintf(startupAction + strlen(startupAction), 
  286.                            " RunScript(%s);", qres.script);
  287.   if (qres.dialAutoStart) strcat(startupAction, " DialEntries(Default);");
  288.  
  289.   /* ---------------------------------------------------------------------- */
  290.  
  291.   linkflag = 2;
  292.   ProcRequest(DISPATCH_ACTION, "", startupAction);
  293.  
  294.   /* ---------------------------------------------------------------------- */
  295.  
  296.   XtSetMappedWhenManaged(topLevel, True);
  297.   XtMapWidget(topLevel);        /* I don't know why I need this, but I do */
  298.  
  299. MainLoop:
  300.   XtAppMainLoop(app_con);
  301.   return 0;
  302. }
  303.  
  304. void
  305. setup_signal_handlers()
  306. {
  307.   signal(SIGINT, SIG_IGN);
  308.   signal(SIGQUIT, SIG_IGN);
  309.  
  310. #ifdef SIGBUS
  311.   signal(SIGBUS, die);
  312. #endif
  313.   signal(SIGFPE, die);
  314.   signal(SIGILL, die);
  315.   signal(SIGIOT, die);
  316.   signal(SIGSEGV, die);
  317.   signal(SIGTERM, die);
  318.   signal(SIGTRAP, die);
  319. }
  320.  
  321. void
  322. die(sig)
  323.      int             sig;
  324. {
  325.   void               KillChildProc();
  326.   signal(sig, SIG_IGN);
  327.  
  328.   SeErrorF("Killed by signal %d", sig, "", "");
  329.   SeNoticeF("Debugging info: pid=%d.", getpid(), "", "");
  330.  
  331.   if (getpid() == mainPid) {
  332.     KillTerminal();
  333.     KillChildProc();
  334.     
  335.     SeNotice("Press any key to exit");
  336.     getchar();
  337.     cleanup_exit(1);
  338.   }
  339.   else {
  340.     write_child_info(child_pipe, KILL_TERM, "Terminal Proc Exited");
  341.     exit(1);
  342.   }
  343. }
  344.  
  345. void
  346. do_exit(rc)
  347.      int             rc;
  348. {
  349.   void               KillChildProc();
  350.  
  351.   XtUnmapWidget(topLevel);
  352.   KillTerminal();
  353.   KillChildProc();
  354.  
  355.   unlock_tty();
  356.  
  357.   fflush(tfp);
  358.   restore_orig_mode();
  359.   fclose(tfp);
  360.  
  361.   CloseModem();
  362.  
  363.   XtDestroyApplicationContext(XtWidgetToApplicationContext(topLevel));
  364.   exit(rc);
  365. }
  366.  
  367. void
  368. cleanup_exit(status)
  369.      int             status;
  370. {
  371.   SeNotice("cleaning up..");
  372.   do_exit(status);
  373. }
  374.  
  375. void
  376. s_exit()
  377. {
  378.   show("I'm rated PG-34!!");
  379.   do_exit(0);
  380. }
  381.